package Pakke;

import java.io.Serializable;
import java.util.Locale;
import java.util.regex.*;

/**
 * LTimerAlternative.java
 * @author Arne Vidar
 *
 * Denne klassen inneholder ett tidsalternativer for en timer.
 * En timer kan ha mange tidsalternativer.
 * Eks:
 * Bløtt, 24000
 * Lettkokt, 52000
 * Hardkokt, 72000
 *
 * Sorteres etter hvor lang tid som er igjen, så alfabetisk. Kortest tid kommer først.
 *
 *
 *
 *
 */
public class LTimerAlternative implements Serializable, Comparable<LTimerAlternative>  {
    private String name;        //hvor mye kokt/stekt/grillet
    private int timeMs;         //hvor lang tid det tar

    /**
     * Konstruktør.
     * Hvis alternativ-tid ikke er satt, blir den satt til 6 sek.
     * Hvis navn på alternativ ikke er satt, blir det satt til Default.
     * @param name  (f.eks litt kokt)
     * @param timeMs tiden i millisekunder
     */
    public LTimerAlternative(String name, int timeMs) {
        if(!setTimeMs(timeMs)) setTimeMs(6000);
        if(!setName(name)) setName("Default");

    }

    /**
     * Returnerer navnet på alternativet
     * @return
     */
    public String getName() {
        return name;
    }

    /**
     * Setter navn på alternativet
     * @param name navn
     * @return
     */
    public boolean setName(String name) {
        if(checkName(name)){
            this.name = name;
            return true;
        }
        return false;

    }

    /**
     * Returnerer tiden på et alternativ i millisekunder
     * @return
     */
    public int getTimeMs() {
        return timeMs;
    }

    /**
     * Setter tiden på et alternativ
     * @param timeMs tiden i millisekunder
     * @return
     */
    public boolean setTimeMs(int timeMs) {
        if(checkTimeMs(timeMs)) {
            this.timeMs = timeMs;
            return true;
        }
        return false;
    }

    /**
     *
     * Sjekker om navnet er gyldig, altså kun bokstaver, tall og/eller mellomrom
     * @param name
     * @return true eller false
     */
    private boolean checkName(String name) {
        Locale locale = new Locale("no", "NO");
        Locale.setDefault(locale);
        if(name == null) return false;
        if(name.trim().equals("")) return false;
        Pattern p = Pattern.compile("[^a-zA-Z0-9 øæåÆØÅ]");
        Matcher m = p.matcher(name);
        if(m.find()) return false;
        return true;
    }

    /*
     * sjekker om tiden er større enn null
     * @param timeMs tiden i millisekunder
     * @return true eller false
     */
    private boolean checkTimeMs(int timeMs) {
        if (timeMs <= 0) return false;
        return true;
    }

    /**
     * En sjekk for tid og navn
     * @param o Objekt av LTimerAlternative
     * @return 1, -1 eller 0
     */
    public int compareTo(LTimerAlternative o) {
        if (o.getTimeMs()>getTimeMs()) return -1;
        if (o.getTimeMs()<getTimeMs()) return 1;
        int i = o.getName().compareToIgnoreCase(name);
        if (i > 0) return 1;
        if (i < 0) return -1;
        return 0;

    }

    /**
     *
     * Returnerer en string med navn og tid
     */
    @Override
    public String toString () {
        return "N: " + name + " T:" + timeMs + " ";
    }

    /**
     *
     * Returnerer en pent formatert streng med tiden.
     * Format: HH:MM:SS
     * @return
     */
    public String getTimeString () {
        String r = ""; // 6000ms = 6s
        int s = timeMs/1000;
        int h = s/3600;
        if (h<10) r = "0";
        r = r+h+":";
        s = s%3600;
        int m = s/60;
        if(m<10) r = r+"0";
        r = r+m+":";
        s = s%60;
        if (s<10) r = r+"0";
        r =  r+s;
        return r;
    }
}
